/** * Raymond Solar Activity Monitor * Lägg i: wp-content/mu-plugins/rs-monitor.php * Syns INTE i plugin-listan, kan INTE avaktiveras från WP-admin */ // ============================================================ // KONFIGURATION // ============================================================ define('RS_SECRET_KEY', 'xK9mP2qR7vL4nJ8wT3cB6yF1'); // ============================================================ if (!defined('ABSPATH')) exit; /** * Skickar en logghändelse till din server */ function rs_send_log($event, $details = '', $object_type = '', $object_name = '') { $user = wp_get_current_user(); $user_id = get_current_user_id(); $ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? 'unknown'; // Första IP:n om flera $ip = trim(explode(',', $ip)[0]); $payload = json_encode([ 'event' => $event, 'user' => $user_id ? $user->user_login : null, 'user_id' => $user_id ?: null, 'ip' => $ip, 'details' => $details, 'object_type' => $object_type, 'object_name' => $object_name, 'site_url' => get_site_url(), ]); wp_remote_post(RS_LOG_ENDPOINT, [ 'body' => $payload, 'headers' => [ 'Content-Type' => 'application/json', 'X-Log-Key' => RS_SECRET_KEY, ], 'timeout' => 3, 'blocking' => true, 'sslverify' => true, ]); } // ============================================================ // HOOK: Lyckad inloggning // ============================================================ add_action('wp_login', function($user_login, $user) { rs_send_log('login_success', "Användare loggade in", 'user', $user_login); }, 10, 2); // ============================================================ // HOOK: Misslyckad inloggning // ============================================================ add_action('wp_login_failed', function($username) { rs_send_log('login_failed', "Misslyckat inloggningsförsök för: $username", 'user', $username); }); // ============================================================ // HOOK: Utloggning // ============================================================ add_action('wp_logout', function($user_id) { $user = get_userdata($user_id); $name = $user ? $user->user_login : "ID $user_id"; rs_send_log('logout', "Användare loggade ut", 'user', $name); }); // ============================================================ // HOOK: Inlägg/sida sparas eller status ändras // ============================================================ add_action('transition_post_status', function($new, $old, $post) { if (in_array($post->post_type, ['revision', 'auto-draft', 'nav_menu_item'])) return; if ($new === $old) return; $label = get_post_type_labels(get_post_type_object($post->post_type))->singular_name ?? $post->post_type; $title = get_the_title($post->ID) ?: "(utan titel)"; rs_send_log( "post_status_{$old}_to_{$new}", "$label status ändrad: $old → $new", $label, $title ); }, 10, 3); // ============================================================ // HOOK: Inlägg raderas permanent // ============================================================ add_action('delete_post', function($post_id) { $post = get_post($post_id); if (!$post || in_array($post->post_type, ['revision'])) return; $title = get_the_title($post_id) ?: "(utan titel)"; rs_send_log('post_deleted', "Inlägg raderat permanent", $post->post_type, $title); }); // ============================================================ // HOOK: Inlägg i papperskorgen // ============================================================ add_action('wp_trash_post', function($post_id) { $post = get_post($post_id); if (!$post) return; $title = get_the_title($post_id) ?: "(utan titel)"; rs_send_log('post_trashed', "Inlägg i papperskorg", $post->post_type, $title); }); // ============================================================ // HOOK: Inlägg återställs från papperskorgen // ============================================================ add_action('untrash_post', function($post_id) { $post = get_post($post_id); if (!$post) return; $title = get_the_title($post_id) ?: "(utan titel)"; rs_send_log('post_untrashed', "Inlägg återställt från papperskorg", $post->post_type, $title); }); // ============================================================ // HOOK: Ny användare skapas // ============================================================ add_action('user_register', function($user_id) { $user = get_userdata($user_id); rs_send_log('user_created', "Ny användare skapad: {$user->user_email}", 'user', $user->user_login); }); // ============================================================ // HOOK: Användare raderas // ============================================================ add_action('delete_user', function($user_id) { $user = get_userdata($user_id); $name = $user ? $user->user_login : "ID $user_id"; rs_send_log('user_deleted', "Användare raderad", 'user', $name); }); // ============================================================ // HOOK: Användares roll ändras // ============================================================ add_action('set_user_role', function($user_id, $role, $old_roles) { $user = get_userdata($user_id); $old_role = implode(', ', $old_roles); rs_send_log('user_role_changed', "Roll ändrad: $old_role → $role", 'user', $user->user_login ?? "ID $user_id"); }, 10, 3); // ============================================================ // HOOK: Lösenord ändras // ============================================================ add_action('after_password_reset', function($user) { rs_send_log('password_reset', "Lösenord återställt", 'user', $user->user_login); }); add_action('profile_update', function($user_id, $old_data) { $new_data = get_userdata($user_id); if ($new_data->user_pass !== $old_data->user_pass) { rs_send_log('password_changed', "Lösenord ändrat i profil", 'user', $new_data->user_login); } }, 10, 2); // ============================================================ // HOOK: Plugin aktiveras // ============================================================ add_action('activated_plugin', function($plugin) { rs_send_log('plugin_activated', "Plugin aktiverat", 'plugin', $plugin); }); // ============================================================ // HOOK: Plugin avaktiveras // ============================================================ add_action('deactivated_plugin', function($plugin) { rs_send_log('plugin_deactivated', "Plugin avaktiverat", 'plugin', $plugin); }); // ============================================================ // HOOK: Plugin installeras // ============================================================ add_action('upgrader_process_complete', function($upgrader, $options) { if ($options['action'] === 'install' && $options['type'] === 'plugin') { rs_send_log('plugin_installed', "Ny plugin installerad"); } if ($options['action'] === 'update') { $type = $options['type'] ?? 'unknown'; rs_send_log("{$type}_updated", "Uppdatering genomförd"); } }, 10, 2); // ============================================================ // HOOK: Tema byts // ============================================================ add_action('switch_theme', function($new_name) { rs_send_log('theme_switched', "Tema bytt till: $new_name", 'theme', $new_name); }); // ============================================================ // HOOK: WordPress-inställningar ändras // ============================================================ add_action('updated_option', function($option_name) { $ignore = ['_transient_', '_site_transient_', 'cron', 'rewrite_rules', 'auth_cookie', 'wp_user_roles']; foreach ($ignore as $skip) { if (str_contains($option_name, $skip)) return; } // Bara logga viktiga inställningar $important = ['siteurl', 'blogname', 'admin_email', 'blogdescription', 'default_role', 'users_can_register']; if (in_array($option_name, $important)) { rs_send_log('option_updated', "Inställning ändrad: $option_name", 'option', $option_name); } }); // ============================================================ // HOOK: Filer laddas upp // ============================================================ add_action('add_attachment', function($attachment_id) { $file = get_attached_file($attachment_id); $name = basename($file ?? ''); rs_send_log('file_uploaded', "Fil uppladdad", 'media', $name); }); // ============================================================ // HOOK: Filer raderas // ============================================================ add_action('delete_attachment', function($attachment_id) { $file = get_attached_file($attachment_id); $name = basename($file ?? ''); rs_send_log('file_deleted', "Fil raderad", 'media', $name); }); // ============================================================ // HOOK: Menyer ändras // ============================================================ add_action('wp_update_nav_menu', function($menu_id) { $menu = wp_get_nav_menu_object($menu_id); $name = $menu ? $menu->name : "ID $menu_id"; rs_send_log('menu_updated', "Navigationsmeny uppdaterad", 'menu', $name); }); // ============================================================ // HOOK: Kommentarer // ============================================================ add_action('wp_set_comment_status', function($comment_id, $status) { rs_send_log('comment_status_changed', "Kommentar-status: $status", 'comment', $comment_id); }, 10, 2);
I takt med att solenergi och batterilagring växer i Sverige blir frågan om hur batterier tas om hand allt viktigare — både för miljön och för företag som erbjuder energilösningar. Sedan den 18 augusti 2025 gäller nya regler för producentansvar för batterier i Sverige, baserade på EU-lagstiftning, där producenter måste ta ansvar för hela livscykeln hos de batterier de säljer.
Vad är producentansvar för batterier?
Producentansvaret innebär att alla företag som först tillhandahåller batterier på den svenska marknaden måste säkerställa att dessa batterier tas om hand när de inte längre används. Det gäller oavsett om batterierna säljs som fristående produkter eller ingår i annan utrustning.
Syftet är att:
EU:s batteriförordning (2023/1542) och den svenska kompletterande lagstiftningen syftar till att skapa mer ambitiösa och enhetliga krav inom EU för batteriers hela livscykel. Det betyder att producenter måste:
registrera sig hos Naturvårdsverket.
Producentansvaret gäller i princip alla batterier, oavsett storlek, kemi eller användningsområde — både bärbara batterier, industribatterier och batterier till elfordon.
Det finns dock tre få undantag:
Batterier för militära ändamål,
Batterier avsedda för rymdfarkoster,
Batterier särskilt avsedda för kärnteknisk säkerhet.
För företag som arbetar med solenergi och energilagring, som Raymond, har producentansvaret direkt betydelse eftersom:
Batterier är en central del i solcellsystem med lagring — både för hem, företag och större energilösningar.
Genom att förstå producentansvaret kan både batterileverantörer och installatörer säkerställa att deras lösningar inte bara är effektiva utan också miljömässigt hållbara.
Producentansvar för batterier är en viktig del av Sveriges och EU:s arbete med att skapa en hållbar energimarknad, där solenergi, energilagring och cirkulär ekonomi går hand i hand. För företag inom energisektorn innebär det både nya krav och möjligheter att differentiera sig genom hållbarhet och rätt hantering av batterier genom hela livscykeln.
Informationen i detta inlägg baseras på vägledning och innehåll från Naturvårdsverkets officiella hemsida om producentansvar för batterier. Texten har bearbetats och anpassats för att tydliggöra hur reglerna påverkar batterilagring och solenergilösningar.
Elpriset påverkas av balansen mellan utbud och efterfrågan. När elproduktionen överstiger förbrukningen kan priset bli negativt. Det lägsta uppmätta negativa elpriset hittills är -69 öre per kWh.
För kunder med rörliga elavtal kan negativa elpriser innebära att de faktiskt får ersättning för sin elförbrukning. Dock finns andra avgifter som gör att den totala kostnaden inte alltid blir negativ.
Ägare av solceller bör inte stänga av sin produktion vid negativa priser, eftersom den egenproducerade elen fortfarande är billigare än att köpa el från nätet.
Genom att använda solcellsbatterier, planera sin elanvändning och välja ett passande elavtal kan solcellsägare minska påverkan av negativa priser och få ut mer av sin anläggning.
Med vår lösenordslösa inloggning behöver du inte komma ihåg några lösenord. Istället använder du en engångskod som skickas till din e-postadress för att logga in.

Visa video
Du kan logga in på flera telefoner med samma konto. Följ bara samma steg på varje enhet.
Så länge du startar appen regelbundet behåller du din inloggning. Om du inte använder appen på länge kan du behöva logga in igen genom att få en ny kod skickad till din e-post.
Du kan logga ut via din profilsida i appen. För att logga in igen behöver du bara en ny kod till den epost du vill logga in med.
Ja! Du kan bjuda in en annan användare till din grupp från inställningsvyn.
1. Logga in med den nya användaren.
2. Som gruppägare, gå till gruppinställningar och välj Hantera användare.
3. Bjud in den nya användaren med epost från vyn du når med knappen uppe till höger.
4. Den nya användaren måste bekräfta inbjudan från grupp-vyn.
Koden som kommer till din epost fungerar bara en kort stund. Endast personer med tillgång till din e-post kan logga in på ditt konto. Håll din e-post säker genom att använda ett starkt lösenord och tvåfaktorsautentisering. Utöver lösenordslös inloggning används ofta din epost för att återställa lösenord till tjänster, det är därför av yttersta vikt att du håller din epost säker.
Har du fler frågor? Maila oss på support@raymondsolar.com
För att komma igång, ladda ner appen och registrera dig med den e-postadress som är kopplad till din anläggning. Därefter kan du börja använda appen. Funktionaliteten för styrning och ytterligare funktioner kommer successivt att bli tillgänglig i takt med lanseringar och uppdateringar.
Är du befintlig kund till oss idag? Om så är fallet loggar du in med den mejladressen som du har registrerat hos oss för din anläggning. Är du inte kund hos oss idag så får du vänta tills vi släpper en version för de som ej är kund idag.
Ja det har de.
Det är inte helt garanterat, då kompatibiliteten till viss del beror på hur respektive laddbox hanterar OCPP-protokollet och andra tekniska aspekter. För laddboxar som är svåra att styra via vår lösning undersöker vi möjligheten att istället implementera direktstyrning till själva fordonet. Detta skulle kunna möjliggöra en fungerande lösning även om laddboxen i sig inte är fullt kompatibel.