/** * 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);
Konsultation:
Vi lyssnar in er målbild och tar hänsyn till husets design, geografiska position & omgivning för att passa dina behov på bästa sätt.
Offerering:
Vi återkommer med en detaljerad offert utifrån husets solcellsanläggning och system, inkl.
gröna teknikbidrag som ni kan tillgodogöra er.
Projektering:
Våra solcellsprojektörer går igenom ert projekt, kontrollerar att allt fungerar tekniskt, gör snö- &
vindlastberäkningar samt tar fram tekniska underlag för våra montörer.
Projektstart:
Vi deltar vid byggstartsmöte där vi i samråd med er elektriker går igenom era förutsätt-
ningar.
Installation av paneler:
Våra egna erfarna montörer installerar panelerna på ert tak och utför arbetet professionellt och i enlighet med gällande lagar och regler.
Installation av utrustning:
I samråd med elektriker installeras växelriktare och annan utrustning på avsedda platser
såsom garage, förråd eller annat lämpligt utrymme.
Överlämning & driftsättning:
När din färdiganmälan är godkänd av din elnätsägare verifierar vi att anläggningen fungerar optimalt. Vi hjälper er att ansluta den till molnet, appar i mobilen eller på dator och portaler.
Support & ägande:
Hos oss är du aldrig ensam. Under hela ert ägande finns vår tekniska support alltid tillgänglig för frågor, råd eller kanske för nya kompletteringar. Hör bara av dig!
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.